package com.itservice.uzalarm;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.InputType;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewFlipper;

public class MathMain extends Activity implements OnClickListener {
	private UzalarmManager uzalarmManager;
	private static boolean isExit = false;
	private static MathMain mMathMain = null;
	private MathProc mMath = null;
	public static UzalarmMediaPlayer mMedia = null;
	public Intent intent = null;
	public String mFilePath = null;
	public TelephonyManager telMan;

	// Flash演算用
	private LinearLayout llcenter;
	private ViewFlipper vfQue; // 問題出力表示
	private EditText etAns; // 数値入力テキスト
	private Button btSet; // 数値決定ボタン
	private Button btStop; // 停止ボタン
	private Button btStart; // 開始ボタン
	private ImageView ivResult;	// 問題正解View
	private ViewHandler handler = null;
	private Timer   mTimer   = null;
	private boolean fecth = false;

	// Flash演算総数
	private final int Q_NUM = 5;
	// Flash演算最大値
	private final int Q_MAX = 9;

	// ステータスバー
	public static NotificationManager mManager = null;
	public static Notification n = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		isExit = false;

		// ステータスバー
		mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		n = new Notification();

		// 　再生する音楽情報の取得
		intent = getIntent();
		mFilePath = intent.getStringExtra("uzalarm_music_path");
		// 基本画面表示
		setContentView(R.layout.math);

		// 自インスタンスを保持
		mMathMain = this;

		// LinearLayoutを取得
		llcenter = (LinearLayout) findViewById(R.id.linerlayoutCenter);

		// 開始ボタンの表示
		MathViewStart();

		// 音楽再生
		mMedia = new UzalarmMediaPlayer(MathMain.this, mFilePath);
		mMedia.AlarmStart();

		telMan = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
		telMan.listen(mListener,
				PhoneStateListener.LISTEN_CALL_STATE);
	}

	// ------------------------------------------------------
	// OnResume
	// ------------------------------------------------------
	@Override
	public void onResume() {
		super.onResume();
		mManager.cancel(1);
	}

	@Override
	public void onPause() {
		super.onPause();

		// PauseのタイミングでStart画面に戻す。
		if(handler != null)
		{
			handler=null;
		}


		if (false == isExit) {
			// 
			if (btStop == null) {
				MathHideStart();
				MathHideAnswer();
				MathHideQuestion();

				MathViewStart();
			}

			n.icon = R.drawable.icon;
			n.when = System.currentTimeMillis();

			Intent i = new Intent(getApplicationContext(), MathMain.class);
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
			PendingIntent pend = PendingIntent.getActivity(this, 0, i, 0);

			n.setLatestEventInfo(getApplicationContext(), "Alarm実行中",
					"クリックでFlash演算が立ち上がります", pend);
			mManager.notify(1, n);
		} else {
			if (mMedia != null) {
				// UzalarmManagerのインスタンス取得
				uzalarmManager = UzalarmManager.getInstance();
				// キー再ロック
				uzalarmManager.Keyguard_Lock(this);

				mMedia.AlarmStop();
				mMedia = null;
			}
		}
	}

	public void onDestory() {
		super.onDestroy();
		isExit = false;
	}

	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		if (event.getAction() == KeyEvent.ACTION_DOWN) {
			// バックキーの無効化
			switch (event.getKeyCode()) {
			case KeyEvent.KEYCODE_BACK:
				return true;
			}
		}
		return super.dispatchKeyEvent(event);
	}

	public class ViewHandler extends Handler {
	    public int cnt = 0;

	    @Override
	    public void handleMessage(Message msg) {

	        if (handler!=null) handler.sleep(2000);
	        
	        //問題最大数超えると自動的に終了させる。
	        if(cnt == Q_NUM)
	        {
	        	// 問題枠を削除する。
	        	MathHideQuestion();
	        	
	        	// 解答枠を表示させる。
	        	MathViewAnswer();
	    		
	        	handler = null;
	        }
	        else if(cnt == 0){
	    		vfQue.setAutoStart(true);
	        }
	        else if(cnt < Q_NUM){
		        vfQue.showNext();
	        }

	        cnt++;
	    }
	 
	    //スリープメソッド
	    public void sleep(long delayMills){
	        //使用済みメッセージの削除
	        removeMessages(0);
	        sendMessageDelayed(obtainMessage(0),delayMills);
	    }
	}

	public void onClick(View v) {
		if (v == btStart) {
			// 問題作成
			mMath = new MathProc(Q_NUM, Q_MAX);

			// Startボタンの削除
			MathHideStart();

			// 問題枠の表示
			MathViewQuestion();

			handler=new ViewHandler();
			handler.sleep(0);
		} else if (v == btStop) {
			// 終了する前にStopボタンを消す。
			MathHideStop();

			// 終了する。
			exit();
		} else if (v == btSet) {
			CharSequence csAns;
			String stAns;
			int iAns;

			// EditViewの値を取得する。
			csAns = etAns.getText();

			//入力された値が何もなかった場合は０にする。
			if(csAns.length() == 0)
			{
				iAns = 0;
			}else{
				stAns = csAns.toString();
				iAns = Integer.parseInt(stAns);				
			}

			Log.v("Uzalarm", "iAns=" + iAns);

			// 解答が正しいか確認
			fecth = mMath.answerFit(iAns);
			
			// 解答枠の削除
			MathHideAnswer();

			//　結果に応じてマークを一時的に表示
			MathViewResult(fecth);
			
			// IMEを消す
            InputMethodManager inputMethodManager = (InputMethodManager) 
            getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);

			//解答マークを表示して1秒待ってからボタンを表示する。
			mTimer = new Timer();
			mTimer.schedule( new TimerTask(){
		        Handler mHandler = new Handler();
		        @Override
		        public void run() {
		            // mHandlerを通じてUI Threadへ処理をキューイング
		            mHandler.post( new Runnable() {
		                public void run() {
		        			//一定時間後マークを消す。
		        			MathHideResult();
		        			
		        			if (fecth == true) {
		        				Log.v("Uzalarm", "OK!!!!");
		        				// 正解の場合
		        				// 停止ボタンの表示
		        				MathViewStop();
		        			} else {
		        				// 不正解の場合
		        				// 開始ボタンの表示
		        				Log.v("Uzalarm", "NG!!!!");

		        				MathViewStart();
		        			}
		                }
		            });
		        }
		    }, 1000);
		}
	}

	// 終了
	public void exit() {
		isExit = true;
		mMathMain.finish();

		// onPauseより先に呼ばれる可能性があるので、nullでなければ音楽を停止する。
		if (null != mMedia) {
			// UzalarmManagerのインスタンス取得
			uzalarmManager = UzalarmManager.getInstance();
			// キー再ロック
			uzalarmManager.Keyguard_Lock(this);

			mMedia.AlarmStop();
			mMedia = null;
		}
	}

	// 開始ボタンの表示
	public boolean MathViewStart() {
		Log.v("Uzalarm", "StartButtonView!!!");
		btStart = new Button(this);
		btStart.setOnClickListener(this);
		btStart.setBackgroundResource(R.drawable.math_start);
		llcenter.addView(btStart);

		return true;
	}

	// 開始ボタンの削除
	public boolean MathHideStart() {
		llcenter.removeView(btStart);
		btStart = null;
		return true;
	}

	// 停止ボタンの表示
	public boolean MathViewStop() {
		btStop = new Button(this);
		btStop.setOnClickListener(this);
		btStop.setBackgroundResource(R.drawable.math_stop);
		
		llcenter.addView(btStop);
		return true;
	}

	// 停止ボタンの削除
	public boolean MathHideStop() {
		llcenter.removeView(btStop);
		btStop = null;
		return true;
	}

	// 問題用TextView表示
	public boolean MathViewQuestion() {
		vfQue = new ViewFlipper(this);		

		for (int i = 0; i < Q_NUM; i++) {
			TextView tvQue = new TextView(this);
			tvQue.setText(Integer.toString(mMath.getMath_Q(i)));
			tvQue.setTextSize(72);
			vfQue.addView(tvQue);
		}

		llcenter.addView(vfQue);
		vfQue.setInAnimation(AnimationUtils.loadAnimation(this,
				R.anim.hyperspace_in));
		vfQue.setOutAnimation(AnimationUtils.loadAnimation(this,
				R.anim.hyperspace_out));

		return true;
	}

	// 問題用TextViewの非表示
	public boolean MathHideQuestion() {
		llcenter.removeView(vfQue);
		vfQue = null;
		return true;
	}

	// 解答枠の表示
	public boolean MathViewAnswer() {
		etAns = new EditText(this);
		etAns.setWidth(200);
		etAns.setTextSize(32);
		etAns.setInputType(InputType.TYPE_CLASS_NUMBER);

		
		btSet = new Button(this);
		btSet.setOnClickListener(this);
		btSet.setBackgroundResource(R.drawable.math_answer);
		llcenter.addView(etAns);
		llcenter.addView(btSet);

		return true;
	}

	// 解答枠の非表示
	public boolean MathHideAnswer() {

		//　キーボードの表示をOFFにする。
		this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_HIDDEN );
		
		llcenter.removeView(etAns);
		llcenter.removeView(btSet);
		etAns = null;
		btSet = null;
		return true;
	}

	// 解答結果イメージの表示
	public boolean MathViewResult(boolean ret) {
		 int dwDisWidth		= 0;	// スクリーン 横サイズ
		
		ivResult = new ImageView(this);
		WindowManager wm	= (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
		Display display		= wm.getDefaultDisplay();
		dwDisWidth	= display.getWidth()-50;
		
		if(ret == true){
			ivResult.setImageResource(R.drawable.math_ok);
		}else{
			ivResult.setImageResource(R.drawable.math_ng);
		}

		llcenter.addView(ivResult,createParam(dwDisWidth,dwDisWidth));
		Log.v("Uzalarm","MathViewResult!!!!");
		return true;
	}

	// 解答結果イメージの非表示
	public boolean MathHideResult() {

		Log.v("Uzalarm","HideResult");
		llcenter.removeView(ivResult);
		ivResult = null;
		return true;
	}

    private LinearLayout.LayoutParams createParam(int w, int h){
        return new LinearLayout.LayoutParams(w, h);
    }

    public PhoneStateListener mListener = new PhoneStateListener() {
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);

			if (null == mMedia) {
				return;
			}

			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING:
			case TelephonyManager.CALL_STATE_OFFHOOK:
				mMedia.AlarmStop();
				break;

			case TelephonyManager.CALL_STATE_IDLE:
				mMedia.AlarmStart();
				break;
			}
			;
		}
	};
}
